"""author: wenyao
   data: 2021/12/13
   project: cjh
"""
# 在Python中，所有以双下划线__包起来的方法，统称为Magic Method（魔术方法），
# 它是一种的特殊方法，普通方法需要调用，而魔术方法不需要调用就可以自动执行。
#
# 魔术方法在类或对象的某些事件触发后会自动执行，让类具有神奇的“魔力”。
# 如果希望根据自己的程序定制自己特殊功能的类，那么就需要对这些方法进行重写。
#
# Python中常用的运算符、for循环、以及类操作等都是运行在魔术方法之上的

# 构造函数（__new__/__init__）
#     • __new__：创建实例
#     • __init__：初始化实例
#  析构函数（__del__）
#     • 在实例释放、销毁的时候自动执行的，通常用于做一些收尾工作， 如关闭一些数据库连接，
#        关闭 打开的临时文件
#  调用方法（__call__）
#     • 把类实例化后的对象当做函数来调用的时候自动被调用

# class ATM:
#     def __del__(self):
#         # fp.close()
#         print("执行del")
#     def __call__(self,name,age):
#         print(f"my name is {name}, my age is {age}")
# a = ATM()
# # # fp = open("a.txt")
# # del a
# # # del a
# # print("删除a")
# #__call__
# a("sc",4)
#
# def func1():
#     pass
# print(dir(func1))


#__str__  __repr__
#返回对象的描述信息
#__str__  默认调用的就是__repr__
#__str__  给用户看的
#__repr__ 更加官方的说明，给程序员看的
# >>> class A:
# ...     def __str__(self):
# ...         return "str....A"
# ...     def __repr__(self):
# ...         return "repr....A"
# ...
# >>> a = A()
# >>> print(a)
# str....A
# >>> result = str(a)
# >>>
# >>> print(result)
# str....A
# >>> a
# repr....A
# >>> class A:
# ...     def __repr__(self):
# ...         return "repr....A"
# ...
# >>> a = A()
# >>> print(a)
# repr....A

# try:
#     a = []
#     print(a[1])
# except IndexError as e:
#     print(e)

# class LenError(Exception):
#     def __init__(self, msg):
#         self.msg = msg
#
#     def __str__(self):
#         return self.msg
#
# lst = [1,2,3,4,5,8,8,8,20,60]
# try:
#     if not 8<= len(lst)<=10:
#         raise LenError("长度不在8到10之间")
# except  LenError as er:
#     print(er)

# __getitem__
# __setitem__
# __delitem__
#让对象以字典的形式去设置或者获取参数
#用在设置或者配置属性使用
# class A:
#     def __init__(self):
#         self.data = {}
#     def __getitem__(self, key):
#         print("get data:")
#         return self.data.get(key, 0)
#     def __setitem__(self, key, value):
#         print("set data:")
#         self.data[key] = value
#     def __delitem__(self, key):
#         print("delete data:")
#         del(self.data[key])
# a = A()
# a["key"] = "value"
# print(a["key"])
# a["k1"] = "v1"
# a["k2"] = "v2"
# print(a.data)
# del a["key"]
# print(a.data)

#定义对象的加号行为
# import time
# class A:
#     def __init__(self, num):
#         self.time = time.time()
#         self.num = num
#     def __add__(self, x):
#         print("this is add")
#         return self.num +x
#     def __gt__(self, other):
#         print("this is gt")
#         return self.time > other.time
# a1 = A(5)
# b = a1 + 6
# print(b)
# time.sleep(1)
# a2 = A(4)
# print(a1 > a2)
# print(dir(a1))


